/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.*;
import org.apache.commons.fileupload.servlet.*;
import java.io.*;



import clases.*;



/**
 *
 * @author ad
 */
public class NuevoUsuario extends HttpServlet {

    
    private final String fotografias=" <form action="+Conexion.localhost+"NuevoUsuario"+" method=\"post\"  enctype=\"MULTIPART/FORM-DATA\">"
                +"Foto"+
                "<input type=\"file\" name=\"foto\" size=50 >"+
                "<br>Firma"+
                "<input type=\"file\" name=\"firma\" size=50>"+
                "<br><input type=\"submit\" value=\"Agregar\" align=\"center\" ><br>"
                +"</form>";

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
         //por si entra sin loguearse al serlet
        HttpSession sesionOk = request.getSession();
            if (sesionOk.getAttribute("Usuario") == null) {
            response.setContentType("text/html;charset=UTF-8");
            response.sendRedirect("/ProyectoBases2/index.jsp");
        }
    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        //procesamos la nueva pagina de agregar datos verificar si estamos en sesion
        PrintWriter out = response.getWriter();
        
               
        HttpSession session = ((HttpServletRequest)request).getSession(false);
       
        try{
        if(session!=null)
        {

            
            if(session.getAttribute("segundax")==null&&session.getAttribute("esempleado")==null)
            {
            //----------------------------------
            //obtenemos los cuatro roles disponibles de checkbox ya q los tenemos independientes
                
            session.setAttribute("x_matris0",request.getParameter("cliente"));
            session.setAttribute("x_matris1",request.getParameter("operador"));
            session.setAttribute("x_matris2",request.getParameter("gerente"));
            session.setAttribute("x_matris3",null);


            session.setAttribute("x_matris4",request.getParameter("nombre"));
            session.setAttribute("x_matris5",request.getParameter("direccion"));
            session.setAttribute("x_matris6",request.getParameter("mail"));
            session.setAttribute("x_matris7",request.getParameter("telefono"));
            session.setAttribute("x_matris8",request.getParameter("departamento"));
            session.setAttribute("x_matris9",request.getParameter("tipo"));
            session.setAttribute("x_matris10",request.getParameter("tipocliente"));
            session.setAttribute("x_matris11","temporal.jpg");//esto se agregara despues
            session.setAttribute("x_matris12","temporal.jpg");//esto se agregara despues
            session.setAttribute("x_matris13",request.getParameter("nit"));
            
            session.setAttribute("x_matris14",request.getParameter("name"));
            session.setAttribute("x_matris15",request.getParameter("Clave1"));
            session.setAttribute("x_matris16",request.getParameter("Clave2"));

                            if(request.getParameter("cliente")!=null){
                            //si es cliente pasamos de una vez a las fotografias
                            session.setAttribute("segundax","segunda");
                            EscribirMensajes("ingrese fotografia y firma para terminar el proceso"+fotografias, response,"Continuar","Usuario_Nuevo.jsp");
                            }
                            else
                            {//si es gerente o operador necesitamos seleccionar datos de la sucursal
                            Conexion x=new Conexion();
                            session.setAttribute("esempleado", "esempleado");
                            session.setAttribute("segundax","segunda");

                            String mensaje=" <form action="+Conexion.localhost+"NuevoUsuario"+" method=\"post\" \">"
                                    +"Seleccione una sucursal <br>"+
                                    "<select name=\"sucursal\">"+
                                    x.regresarSucursalxdepartamento(request.getParameter("departamento"))+
                                    "</select><br><br>"
                                    +"<input type=\"submit\" value=\"Siguiente\" align=\"center\" ><br></form>";


                            EscribirMensajes(mensaje, response,"Continuar","Usuario_Nuevo.jsp");
                            }
            //-----------------------------------
            //----------------------------------
            }
            else{
            //esto es para la segunda vez
            //obtenemos los cuatro roles disponibles de checkbox ya q los tenemos independientes
            String [] matris=new String[4];
            matris[0]=(String) session.getAttribute("x_matris0");
            matris[1]=(String) session.getAttribute("x_matris1");
            matris[2]=(String) session.getAttribute("x_matris2");
            matris[3]=null;

            Tipo [] param=new Tipo[11];
            param[0]=new Tipo((String) session.getAttribute("x_matris4"),"nombre");
            param[1]=new Tipo((String) session.getAttribute("x_matris5"),"direccion");
            param[2]=new Tipo((String) session.getAttribute("x_matris6"),"mail");
            param[3]=new Tipo((String) session.getAttribute("x_matris7"),"telefono");
            param[4]=new Tipo((String) session.getAttribute("x_matris8"),"departamento");
            param[5]=new Tipo((String) session.getAttribute("x_matris9"),"tipo");
            param[6]=new Tipo((String) session.getAttribute("x_matris10"),"tipocliente");
            //antes de eso subimos las imagenes y cambiamos el nombre de la imagen por el nombre del usuario
            String[] fots=subirImagense(request,out,param[0].getvalor());
            param[7]=new Tipo(fots[0],"foto");//esto se agregara despues
            param[8]=new Tipo(fots[1],"firma");//esto se agregara despues
            param[9]=new Tipo((String) session.getAttribute("x_matris13"),"nit");
            
            if(session.getAttribute("esempleado")!=null)
            param[10]=new Tipo(request.getParameter("sucursal"),"sucursal");
            else{
                //no es valido ya que es cliente
            param[10]=new Tipo("***","sucursal");
            }
            //-----------------------------------
            ingresarNuevoUsuarioJDBC(request, (String) session.getAttribute("x_matris14"), (String) session.getAttribute("x_matris15"), (String) session.getAttribute("x_matris16"),matris,response,param);
            limpiarVariables(request);

            }
        }
        else{
           //si no tiene sesion abierta
          response.sendRedirect("/ProyectoBases2/index.jsp");
        }

        }catch(Exception xs)
        {
          System.out.println("a corrido una excepcion..........."+xs.getMessage());
          limpiarVariables(request);
        }
         finally {
            out.close();
        }

        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    /***
     * metodo utilizado para ingresar un nuevo usuario a la base de datos
     *
     **/
    private void ingresarNuevoUsuarioJDBC(HttpServletRequest request,String usuarioNuevo,String passwords1,String passwords2,String[] matris,HttpServletResponse response,Tipo [] param) throws IOException {
            Conexion nueva=new Conexion();
            Error_Data misErrores=new Error_Data();

            //verificar si los demas campos viene llenos
            if(verificarCamposExtras(param,misErrores,response,matris)){
            //verificamos que se halla seleccionado solo un rol para el usuario
            if(misErrores.SeleccionRoles_UN(matris)){
                    //que los dos password sean iguales
                    if(passwords1.compareTo(passwords2)!=0){
                        misErrores.EscribirMensajes("Error passwords no coinciden", response,"Regresar","Usuario_Nuevo.jsp");
                    }else if(misErrores.CaracterExtraño(passwords1)){//no tengan carcteres esxtraños
                        misErrores.EscribirMensajes("Error caracteres invalidos en el password",response,"Regresar","Usuario_Nuevo.jsp");
                    }else if(misErrores.CaracterExtraño(usuarioNuevo)){//caracter extraño
                        misErrores.EscribirMensajes("Error caracteres invalidos en el usuario",response,"Regresar","Usuario_Nuevo.jsp");
                    }else{
                        //si todo esta bien se crea el nuevo usuario y se escribe el mensaje
                        if(nueva.CrearUsuario(usuarioNuevo,passwords1,matris,response,misErrores,param))
                        {
                            misErrores.EscribirMensajes("Se creo el nuevo usuario con nombre:" + usuarioNuevo, response, "Continuar", "Usuario_Nuevo.jsp");
                            
                        }

                    }
                                                    }

            else{
                misErrores.EscribirMensajes("Error selecciono mas de un rol a la vez o no selecciono ningun rol",response,"Regresar","Usuario_Nuevo.jsp");

            }
        }


          
        }

    /***
     * regresa false si tiene campos vacios o malos
     * y regresa true si todo los campos esta en orden
     **/
    private boolean verificarCamposExtras(Tipo[] param, Error_Data misErrores,HttpServletResponse response,String[] matris) {

     //que tipo de usuario es para indicar si es valido o no el campo que se esta evaluando
     Comparacion mi=new Comparacion();
     String tip=mi.tipo_de_usuario_insercion_modelo(matris);

     try{
        for (int i = 0; i < param.length; i++) {
            Tipo tipo = param[i];
            if(tipo.gettipo().compareTo("nombre")==0){
                 if(misErrores.Solo_Letras(tipo.getvalor())==false)
                 {
                     misErrores.EscribirMensajes("Error en el campo nombre <br>con el valor de: "+tipo.getvalor(), response,"Regresar","Usuario_Nuevo.jsp");
                     return false;
                 }
            }else if(tipo.gettipo().compareTo("direccion")==0)
            {
                 if(misErrores.Solo_Letras1(tipo.getvalor())==false)
                 {
                      misErrores.EscribirMensajes("Error en el campo direccion <br>con el valor de: "+tipo.getvalor(), response,"Regresar","Usuario_Nuevo.jsp");
                     return false;
                 }
            }else if(tipo.gettipo().compareTo("mail")==0)
            {
                  if(misErrores.Solo_Letras2(tipo.getvalor())==false)
                  {
                       misErrores.EscribirMensajes("Error en el campo mail <br>con el valor de: "+tipo.getvalor(), response,"Regresar","Usuario_Nuevo.jsp");
                      return false;
                  }
            }else if(tipo.gettipo().compareTo("telefono")==0)
            {
                  if(misErrores.Solo_Numeros3(tipo.getvalor())==false)
                  {
                       misErrores.EscribirMensajes("Error en el campo telefono <br>con el valor de: "+tipo.getvalor(), response,"Regresar","Usuario_Nuevo.jsp");
                      return false;
                  }
            }else if(tipo.gettipo().compareTo("foto")==0&&tip.compareTo("cliente")==0)
            {//si solo si se va a insertar un cliente
               if(misErrores.verificar_imagenes(tipo.getvalor())==false)
               {
                   misErrores.EscribirMensajes("Error en el campo foto no se selecciono ninguna foto valida", response,"Regresar","Usuario_Nuevo.jsp");
                   return false;
               }
            }else if(tipo.gettipo().compareTo("firma")==0&&tip.compareTo("cliente")==0)
            {//si solo si se va a insertar un cliente
               if(misErrores.verificar_imagenes(tipo.getvalor())==false)
               {
                   misErrores.EscribirMensajes("Error en el campo firma no se selecciono ninguna foto valida", response,"Regresar","Usuario_Nuevo.jsp");
                   return false;
               }
            }else if(tipo.gettipo().compareTo("nit")==0)
            {//si solo si se va a insertar un cliente
               if(misErrores.verificar_nit(tipo.getvalor())==false)
               {
                   misErrores.EscribirMensajes("Error en el campo nit", response,"Regresar","Usuario_Nuevo.jsp");
                   return false;
               }
            }


        }
        }catch(Exception q)
        {
         System.out.println(q.getMessage());
        }

        return true;

    }

 public void EscribirMensajes(String mensaje, HttpServletResponse response, String Ir_a,String pagina) throws IOException {
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here
             */
            out.println(
                    "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"
                    + "<html>"
                    + "<head>"
                    + "<title>Banco Central</title>"
                    + "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />"
                    + "<link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\" />"
                    + "<script type=\"text/javascript\" src=\"js/jquery-1.3.2.min.js\"></script>"
                    + "<script type=\"text/javascript\" src=\"js/script.js\"></script>"
                    + "<script type=\"text/javascript\" src=\"js/cufon-yui.js\"></script>"
                    + "<script type=\"text/javascript\" src=\"js/arial.js\"></script>"
                    + "<script type=\"text/javascript\" src=\"js/cuf_run.js\"></script>"
                    + "<meta http-equiv==\"Pragma\" content=\"no-cache\"/>"
                    + "<meta http-equiv=\"Expires\" content=\"-1\"/>"
                    + "<meta http-equiv==\"Cache-Control\" content=\"no-store\"/>"
                    + "<meta http-equiv=\"Cache\" content=\"no-cache\"/>"
                    + "<script lenguaje=\"JavaScript\">"
                    + "if(window.history.forward(1) != null)"
                    + "   window.history.forward(1);"
                    + "</script>"
                    + "</head>"
                    + "<body>"
                    + "<div class=\"main\">"
                    + "  <div class=\"header\">"
                    + "   <div class=\"header_resize\">"
                    + "    <div class=\"logo\">"
                    + "     <h1><a href=\"index.jsp\"><span>Siempre</span> a su lado</a></h1>"
                    + "   </div>"
                    + "  <div class=\"menu_nav\">"
                    + "   <ul>"
                    + "    <li class=\"active\"><a href=\""+pagina+"\">" + Ir_a + "</a></li>"
                    + " </ul>"
                    + "</div>"
                    + "<div class=\"clr\"></div>"
                    + "<div class=\"hbg\"><img src=\"images/header_images.jpg\" width=\"400\" height=\"275\" alt=\"\" class=\"fl\" />"
                    + " <div class=\"info fl\">"
                    + "  <h3>Banco Central <br />"
                    + "   Uniendo al mundo </h3>"
                    + " </div>"
                    + " <div class=\"clr\"></div>"
                    + "</div>"
                    + "<div class=\"clr\"></div>"
                    + "</div>  </div>"
                    + " <div class=\"content\">"
                    + "  <div class=\"content_resize\">"
                    + " <div class=\"article\">"
                    + "   <center><h4><span>" + mensaje + "</span></h4></center>"
                    + "  <div class=\"clr\"></div>"
                    + "  </div>"
                    + "     <div class=\"sidebar\">"
                    + "    <div class=\"gadget\">"
                    + "     <h2 class=\"star\"><span>Nuestro</span> Menu</h2>"
                    + "    <div class=\"clr\"></div>"
                    + "   <ul class=\"sb_menu\">"
                    + "    <li class=\"active\"><a href=\""+pagina+"\">" + Ir_a + "</a></li>"
                    + "  <br> </br>  "
                    + "</ul></div></div>"
                    + "<div class=\"clr\"></div>"
                    + "</div></div>"
                    + "<div class=\"footer\">"
                    + " <div class=\"footer_resize\">"
                    + "  <p class=\"lf\">&copy; Copyright <a href=\"#\">MyWebSite</a>.</p>"
                    + " <p class=\"rf\">Layout by I <a href=\"http://www.iwebsitetemplate.com/\">Website Templates</a></p>"
                    + "<div class=\"clr\"></div>"
                    + "</div></div></div>"
                    + "</body></html>");
        }catch(Exception xs)
        {
            System.out.println("***********generado en la clase ERROR_DATA 9 parametros");
            System.out.println(xs.getMessage());
        }
        finally {
            out.close();
        }
    }

    private void limpiarVariables(HttpServletRequest request) {
        HttpSession session = ((HttpServletRequest)request).getSession(false);
        if(session!=null)
        {
            session.removeAttribute("matris0");
            session.removeAttribute("matris1");
            session.removeAttribute("matris2");
            session.removeAttribute("matris3");
            session.removeAttribute("matris4");
            session.removeAttribute("matris5");
            session.removeAttribute("matris6");
            session.removeAttribute("matris7");
            session.removeAttribute("matris8");
            session.removeAttribute("matris9");
            session.removeAttribute("matris10");
            session.removeAttribute("matris11");
            session.removeAttribute("matris12");
            session.removeAttribute("matris13");
            session.removeAttribute("matris14");
            session.removeAttribute("matris15");
            session.removeAttribute("matris16");
            session.removeAttribute("segundax");
            session.removeAttribute("esempleado");

        }

    }


    public String[] subirImagense(HttpServletRequest request, PrintWriter out, String nombre) {
            String [] retorno = {"",""};
            FileItemFactory file_factory = new DiskFileItemFactory();
            /*ServletFileUpload esta clase convierte los input file a FileItem*/
            ServletFileUpload servlet_up = new ServletFileUpload(file_factory);
            int i1=0;
            
            try{
            /*sacando los FileItem del ServletFileUpload en una lista */
            List items = servlet_up.parseRequest(request);
            for(int i=0;i<items.size();i++){
             /*FileItem representa un archivo en memoria que puede ser pasado al disco duro*/
             FileItem item = (FileItem) items.get(i);
             /*item.isFormField() false=input file; true=text field*/
             Querys nus=new Querys();
             String rutaAbsoluta_imagenes=nus.rutaAbsoluta_imagenes;
             
             if (! item.isFormField()){
                /*cual sera la ruta al archivo en el servidor*/
                 String ruta="";
                 if(i1==0)
                 {
                     ruta = rutaAbsoluta_imagenes + nombre + "_foto.jpg";//item.getName();
                     retorno[0]=nombre + "_foto.jpg";
                 }
                 else
                 {
                     ruta = rutaAbsoluta_imagenes + nombre + "_firma.jpg";//item.getName();
                     retorno[1]=nombre + "_firma.jpg";
                 }

                 i1++;
                 
                 File archivo_server = new File(ruta);
                 /*y lo escribimos en el servido*/
                 item.write(archivo_server);
                 //out.print("Nombre --> " + item.getName() );
                 //out.print("<br> Tipo --> " + item.getContentType());
                 //out.print("<br> tamaño --> " + (item.getSize()/1240)+ "KB");
                 //out.print("<br>");
             }

         }}catch(Exception xss)
         {
             System.out.println("Error en el metodo subirimagenes"+xss.getMessage());
         }
            return retorno;
    }

     /***
      * en este tiene que venir aunquese una de las dos la diferencia es 
      * la forma en que es incrementa con el metodo susbirImagene
      ***/
     public boolean subirImagense_actualizacion(HttpServletRequest request, PrintWriter out, String nombre) {

            FileItemFactory file_factory = new DiskFileItemFactory();
            /*ServletFileUpload esta clase convierte los input file a FileItem*/
            ServletFileUpload servlet_up = new ServletFileUpload(file_factory);
            int i1=0;

            try{
            /*sacando los FileItem del ServletFileUpload en una lista */
            List items = servlet_up.parseRequest(request);
            for(int i=0;i<items.size();i++){
             /*FileItem representa un archivo en memoria que puede ser pasado al disco duro*/
             FileItem item = (FileItem) items.get(i);
             /*item.isFormField() false=input file; true=text field*/
             if(i==0||i==2)
                 continue;
             
             i1++;
             if (! item.isFormField()){
                /*cual sera la ruta al archivo en el servidor*/
                 String ruta="";
                 String comparar=item.getName();
                 Querys nus=new Querys();
                 String rutaAbsoluta_imagenes=nus.rutaAbsoluta_imagenes;
                 
                 if(i1==1)
                 {
                     if(comparar.compareTo("")!=0)
                     {
                         ruta = rutaAbsoluta_imagenes + nombre + "_foto.jpg";//item.getName();
                     File archivo_server = new File(ruta);
                     /*y lo escribimos en el servido*/
                     item.write(archivo_server);
                     }
                 }
                 else
                 {
                     if(comparar.compareTo("")!=0)
                     {
                         ruta = rutaAbsoluta_imagenes + nombre + "_firma.jpg";//item.getName();
                      File archivo_server = new File(ruta);
                     /*y lo escribimos en el servido*/
                      item.write(archivo_server);
                     }
                 }



                
             }

         }}catch(Exception xss)
         {
             System.out.println("Error en el metodo subirimagenes"+xss.getMessage());
             return false;
         }

         return true;
           
    }

}